home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / do / undef < prev    next >
Encoding:
Text File  |  1992-08-15  |  1.4 KB  |  60 lines

  1. int                        /*SUPPRESS 590*/
  2. do_undef(TARG,arg,gimme,arglast)
  3. STR *TARG;
  4. register ARG *arg;
  5. int gimme;
  6. int *arglast;
  7. {
  8.     register int type;
  9.     register STAB *stab;
  10.     int retarg = arglast[0] + 1;
  11.  
  12.     if ((arg[1].arg_type & A_MASK) != A_LEXPR)
  13.     fatal("Illegal argument to undef()");
  14.     arg = arg[1].arg_ptr.arg_arg;
  15.     type = arg->arg_type;
  16.  
  17.     if (type == O_ARRAY || type == O_LARRAY) {
  18.     stab = arg[1].arg_ptr.arg_stab;
  19.     afree(stab_xarray(stab));
  20.     stab_xarray(stab) = anew(stab);        /* so "@array" still works */
  21.     }
  22.     else if (type == O_HASH || type == O_LHASH) {
  23.     stab = arg[1].arg_ptr.arg_stab;
  24.     if (stab == envstab)
  25.         environ[0] = Nullch;
  26.     else if (stab == sigstab) {
  27.         int i;
  28.  
  29.         for (i = 1; i < NSIG; i++)
  30.         signal(i, SIG_DFL);    /* munch, munch, munch */
  31.     }
  32.     (void)hfree(stab_xhash(stab), TRUE);
  33.     stab_xhash(stab) = Null(HASH*);
  34.     }
  35.     else if (type == O_SUBR || type == O_DBSUBR) {
  36.     stab = arg[1].arg_ptr.arg_stab;
  37.     if ((arg[1].arg_type & A_MASK) != A_WORD) {
  38.         STR *tmpstr = STAB_STR(arg[1].arg_ptr.arg_stab);
  39.  
  40.         if (tmpstr)
  41.         stab = stabent(str_get(tmpstr),TRUE);
  42.         else
  43.         stab = Nullstab;
  44.     }
  45.     if (stab && stab_sub(stab)) {
  46.         cmd_free(stab_sub(stab)->cmd);
  47.         stab_sub(stab)->cmd = Nullcmd;
  48.         afree(stab_sub(stab)->tosave);
  49.         Safefree(stab_sub(stab));
  50.         stab_sub(stab) = Null(SUBR*);
  51.     }
  52.     }
  53.     else
  54.     fatal("Can't undefine that kind of object");
  55.     str_numset(TARG,0.0);
  56.     stack->ary_array[retarg] = TARG;
  57.     return retarg;
  58. }
  59.  
  60.